package com.dyzx.hbb.modules.car.controller;

import com.dyzx.hbb.common.base.Result;
import com.dyzx.hbb.common.config.MyLambdaQueryWrapper;
import com.dyzx.hbb.modules.car.entity.CarMark;
import com.dyzx.hbb.modules.car.entity.CarModel;
import com.dyzx.hbb.modules.car.entity.CarModelArea;
import com.dyzx.hbb.modules.car.service.CarMarkService;
import com.dyzx.hbb.modules.car.service.CarModelAreaService;
import com.dyzx.hbb.modules.car.service.CarModelService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 车辆信息控制器
 * 
 * 功能说明：
 * - 负责处理车辆品牌、车型和地区配置等相关信息的查询操作
 * - 提供树形结构数据查询，支持多级嵌套数据返回
 * - 实现数据缓存，提高查询性能
 * 
 * 数据结构：
 * - 品牌(CarMark) -> 车型(CarModel) -> 地区配置(CarModelArea)
 * 
 * 缓存策略：
 * - 使用Spring Cache注解实现缓存
 * - 缓存键：car::tree
 * 
 * @author 开发团队
 * @version 1.0.0
 * @since 2023-05-30
 */
@RestController
@RequestMapping("/car")
@Tag(name = "12.车辆信息", description = "车辆信息管理接口，包括品牌、车型和地区配置等信息的查询")
public class CarController {
    @Autowired
    private CarMarkService carMarkService;
    @Autowired
    private CarModelService carModelService;
    @Autowired
    private CarModelAreaService carModelAreaService;
    /**
     * 获取车辆品牌车型树形结构
     * 
     * 功能说明：
     * - 查询所有车辆品牌、车型和地区配置信息
     * - 按查询次数(findCount)降序排序，优先展示热门数据
     * - 构建三级树形结构：品牌->车型->地区配置
     * 
     * 缓存说明：
     * - 缓存键：car::tree
     * - 缓存时间：默认缓存策略
     * 
     * @return 包含车辆品牌、车型和地区配置的树形结构数据
     */
    @RequestMapping("/tree")
    //@Cacheable(value = "car", key = "'tree'")
    @Operation(summary = "获取车辆品牌车型树形结构", description = "获取车辆品牌、车型和地区配置的树形结构数据，按查询次数降序排列")
    public Result<List<Map<String, Object>>> tree() {



        List< Map<String, Object>>  list=carMarkService.findByTreeList();;

        return Result.ok(list);
    }
    /**
     * 构建车型树形结构
     * 
     * 功能说明：
     * - 查询所有车型信息，按查询次数降序排序
     * - 关联地区配置数据，构建车型->地区配置的二级树形结构
     * - 过滤查询次数为0的车型数据
     * 
     * @param childrenArea 地区配置数据列表
     * @return 车型树形结构数据
     */
    private List<Map<String, Object>> treeMarkModal(List<Map<String, Object>> childrenArea)  {
        List<Map<String, Object>> results=new ArrayList<>();
        MyLambdaQueryWrapper<CarModel> queryWrapper = new MyLambdaQueryWrapper<>();
        queryWrapper.orderByDesc(CarModel::getFindCount);
        queryWrapper.gt(CarModel::getFindCount,0);

        List<CarModel> list=carModelService.list(queryWrapper);
        for (CarModel carModel : list) {
            Map<String, Object> map=new HashMap<>() ;
            map.put("id",carModel.getId());
            map.put("name",carModel.getModel());
            map.put("logo",carModel.getLogo());
            map.put("mark_id",carModel.getMarkId());
            map.put("trim_level",carModel.getTrimLevel());
            map.put("body_type",carModel.getBodyType());
            map.put("level_name",carModel.getLevelName());
         if(carModel.getFindCount()>0) {
             List<Map<String, Object>> children = childrenArea.stream().filter(item -> item.get("modal_id").equals(carModel.getId())).toList();
                map.put("children", children);
            }else {
                map.put("children", List.of());
            }
            results.add(map);
        }
        return results;
    }

    /**
     * 构建车型地区配置树形结构
     * 
     * 功能说明：
     * - 查询所有车型地区配置信息
     * - 提取关键属性，构建地区配置数据列表
     * - 包含价格区间、传动方式、驱动模式等关键信息
     * 
     * @return 车型地区配置数据列表
     */
    private List<Map<String, Object>> treeModalArea()   {
        List<Map<String, Object>> results=new ArrayList<>();
        MyLambdaQueryWrapper<CarModelArea> queryWrapper = new MyLambdaQueryWrapper<>();

        List<CarModelArea> list=carModelAreaService.list(queryWrapper);
        for (CarModelArea carModelArea : list) {
            Map<String, Object> map=new HashMap<>() ;
            map.put("id",carModelArea.getId());
            map.put("name",carModelArea.getName());
            map.put("modal_id",carModelArea.getModelId());
            map.put("trans_mission",carModelArea.getTransMission());
            map.put("drive_mode_name",carModelArea.getDriveModeName());
            map.put("year",carModelArea.getYear());
            map.put("min_price",carModelArea.getMinPrice());
            map.put("max_price",carModelArea.getMaxPrice());
            results.add(map);
        }
        return results;
    }
}
